package com.lpf.streamAPI;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

import org.junit.Test;

import com.lpf.common.Employee;
import com.lpf.common.Status;

/**
 * 查找与匹配
 */
@SuppressWarnings("ALL")
public class StreamAPI_End_1 {

	List<Employee> emps = Arrays.asList(
			new Employee(102, "李四", 79, 6666.66, Status.BUSY),
			new Employee(101, "张三", 18, 9999.99, Status.FREE),
			new Employee(103, "王五", 28, 3333.33, Status.VOCATION),
			new Employee(104, "赵六", 8, 7777.77, Status.BUSY),
			new Employee(104, "赵六", 8, 7777.77, Status.FREE),
			new Employee(104, "赵六", 8, 7777.77, Status.FREE),
			new Employee(105, "田七", 38, 5555.55, Status.BUSY)
	);

	/**
	 * allMatch——检查是否匹配所有元素
	 * anyMatch——检查是否至少匹配一个元素
	 * noneMatch——检查是否没有匹配的元素
	 * findFirst——返回第一个元素
	 * findAny——返回当前流中的任意元素
	 * count——返回流中元素的总个数
	 * max——返回流中最大值
	 * min——返回流中最小值
	 */
	@Test
	public void testMatch(){
			boolean bl = emps.stream()
							.allMatch((e) -> e.getStatus().equals(Status.BUSY));
			System.out.println(bl);

			boolean bl1 = emps.stream()
							.anyMatch((e) -> e.getStatus().equals(Status.BUSY));
			System.out.println(bl1);

			boolean bl2 = emps.stream()
							.noneMatch((e) -> e.getStatus().equals(Status.BUSY));
			System.out.println(bl2);
	}

	@Test
	public void testFind(){
		Optional<Employee> op = emps.stream()
									.sorted((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary()))
									.findFirst();
		System.out.println(op.get());

		System.out.println("--------------------------------");

		op = emps.parallelStream()
				 .filter((e) -> e.getStatus().equals(Status.FREE))
				 .findAny();
		System.out.println(op.get());
	}

	@Test
	public void testMaxOrMin(){
		long count = emps.stream()
						 .filter((e) -> e.getStatus().equals(Status.FREE))
						 .count();
		System.out.println(count);

		Optional<Double> op = emps.stream()
								  .map(Employee::getSalary)
								  .max(Double::compare);
		System.out.println(op.get());

		Optional<Employee> op2 = emps.stream()
									 .min((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary()));
		System.out.println(op2.get());

		//注意：流进行了终止操作后，不能再次使用
	}
}
